//package com.mall.module.user.service.Impl;
//
//import com.mall.common.enums.LogoutReasonEnum;
//import com.mall.common.exception.BusinessException;
//import com.mall.common.model.UserAuth;
//import com.mall.common.result.ResultCode;
//import com.mall.framework.security.JwtTokenProvider;
//import com.mall.framework.service.CacheService;
//import com.mall.framework.util.DeviceUtil;
//import com.mall.module.user.domain.dto.UserLoginDTO;
//import com.mall.module.user.domain.dto.UserRegisterDTO;
//import com.mall.module.user.domain.entity.User;
//import com.mall.module.user.domain.entity.UserCredential;
//import com.mall.module.user.domain.vo.UserLoginVO;
//import com.mall.module.user.domain.vo.UserRegisterVO;
//import com.mall.module.user.mapper.UserCredentialMapper;
//import com.mall.module.user.mapper.UserMapper;
//import com.mall.module.user.service.UserService;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.BeanUtils;
//import org.springframework.security.authentication.AuthenticationManager;
//import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
//import org.springframework.security.core.Authentication;
//import org.springframework.security.core.context.SecurityContextHolder;
//import org.springframework.security.crypto.password.PasswordEncoder;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.util.StringUtils;
//
//import javax.servlet.http.HttpServletRequest;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.util.UUID;
//
//@Service
//@RequiredArgsConstructor
//@Slf4j
//public class UserServiceImpl implements UserService {
//    private final UserMapper userMapper;
//    private final UserCredentialMapper userCredentialMapper;
//    private final AuthenticationManager authenticationManager;
//    private final JwtTokenProvider jwtTokenProvider;
//    private final PasswordEncoder passwordEncoder;
//    private final CacheService cacheService;
//
//    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//
//    /**
//     * 用户注册
//     *
//     * @param registerDTO 注册信息
//     * @return 注册结果
//     */
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public UserRegisterVO register(UserRegisterDTO registerDTO) {
//        // 检查用户名是否已存在
//        if (userMapper.selectByUsername(registerDTO.getUsername()) != null) {
//            throw new BusinessException(ResultCode.DATA_ALREADY_EXISTED.getCode(), "用户名已存在");
//        }
//
//        // 检查手机号是否已存在
//        if (StringUtils.hasText(registerDTO.getMobile()) && userMapper.selectByMobile(registerDTO.getMobile()) != null) {
//            throw new BusinessException(ResultCode.DATA_ALREADY_EXISTED.getCode(), "手机号已存在");
//        }
//
//        // 检查邮箱是否已存在
//        if (StringUtils.hasText(registerDTO.getEmail()) && userMapper.selectByEmail(registerDTO.getEmail()) != null) {
//            throw new BusinessException(ResultCode.DATA_ALREADY_EXISTED.getCode(), "邮箱已存在");
//        }
//
//        // 检查密码与确认密码是否一致
//        if (!registerDTO.getPassword().equals(registerDTO.getConfirmPassword())) {
//            throw new BusinessException(ResultCode.BAD_REQUEST.getCode(), "两次密码输入不一致");
//        }
//
//        // 创建用户
//        User user = new User();
//        user.setUsername(registerDTO.getUsername());
//        user.setNickname(registerDTO.getUsername()); // 默认昵称与用户名相同
//        user.setMobile(registerDTO.getMobile());
//        user.setEmail(registerDTO.getEmail());
//        user.setUuid(UUID.randomUUID().toString().replace("-", ""));
//        user.setStatus(1); // 正常状态
//        user.setUserLevel(0); // 默认等级
//        user.setGrowthPoints(0); // 初始成长值
//        user.setRegisterTime(LocalDateTime.now());
//        user.setRegisterIp(registerDTO.getRegisterIp());
//        user.setUpdateTime(LocalDateTime.now());
//
//        // 插入用户记录
//        userMapper.insert(user);
//
//        // 创建用户密码凭证
//        UserCredential credential = new UserCredential();
//        credential.setUserId(user.getUserId());
//        credential.setIdentityType("PASSWORD");
//        credential.setIdentifier(user.getUsername());
//        credential.setSalt(UUID.randomUUID().toString().substring(0, 6));
//        credential.setCredential(passwordEncoder.encode(registerDTO.getPassword() + credential.getSalt()));
//        credential.setVerified(true);
//
//        // 插入凭证记录
//        userCredentialMapper.insert(credential);
//
//        // 生成token
//        String token = jwtTokenProvider.generateToken(user.getUsername());
//
//        // 返回结果
//        UserRegisterVO result = new UserRegisterVO();
//        result.setUserId(user.getUserId());
//        result.setUsername(user.getUsername());
//        result.setNickname(user.getNickname());
//        result.setMobile(user.getMobile());
//        result.setEmail(user.getEmail());
//        result.setRegisterTime(user.getRegisterTime().format(FORMATTER));
//        result.setRegisterIp(user.getRegisterIp());
//        result.setToken(token);
//
//        return result;
//    }
//
//    /**
//     * 用户登录
//     *
//     * @param loginDTO 登录信息
//     * @return 登录结果
//     */
//    @Override
//    public UserLoginVO login(UserLoginDTO loginDTO) {
//        // 根据登录类型处理
//        if ("PASSWORD".equals(loginDTO.getLoginType())) {
//            // 密码登录
//            return passwordLogin(loginDTO);
//        } else if ("WECHAT".equals(loginDTO.getLoginType()) || "ALIPAY".equals(loginDTO.getLoginType())) {
//            // 第三方登录，需要根据authCode获取第三方用户信息
//            return oauthLogin(loginDTO);
//        } else if ("PHONE".equals(loginDTO.getLoginType())) {
//            // 手机验证码登录
//            return phoneLogin(loginDTO);
//        } else {
//            throw new BusinessException(ResultCode.BAD_REQUEST.getCode(), "不支持的登录类型");
//        }
//    }
//
//    /**
//     * 密码登录
//     */
//    private UserLoginVO passwordLogin(UserLoginDTO loginDTO) {
//        // 尝试认证
//        try {
//            Authentication authentication = authenticationManager.authenticate(
//                new UsernamePasswordAuthenticationToken(loginDTO.getAccount(), loginDTO.getPassword())
//            );
//            SecurityContextHolder.getContext().setAuthentication(authentication);
//
//            // 获取用户信息
//            User user = getUserByAccount(loginDTO.getAccount());
//            if (user == null) {
//                throw new BusinessException(ResultCode.USER_NOT_EXIST);
//            }
//
//            // 更新登录信息
//            user.setLastLoginTime(LocalDateTime.now());
//            user.setLastLoginIp(loginDTO.getLoginIp());
//            userMapper.update(user);
//
//            // 生成token
//            String token = jwtTokenProvider.generateToken(user.getUsername());
//
//            // 构建登录返回结果
//            return buildLoginVO(user, token);
//        } catch (Exception e) {
//            throw new BusinessException(ResultCode.BAD_REQUEST.getCode(), "用户名或密码错误");
//        }
//    }
//
//    /**
//     * 第三方登录
//     */
//    private UserLoginVO oauthLogin(UserLoginDTO loginDTO) {
//        // 这里需要调用第三方接口获取用户信息，暂时模拟实现
//        throw new BusinessException(ResultCode.BAD_REQUEST.getCode(), "暂不支持第三方登录");
//    }
//
//    /**
//     * 手机验证码登录
//     */
//    private UserLoginVO phoneLogin(UserLoginDTO loginDTO) {
//        // 验证验证码
//        String cacheKey = "login:phone:" + loginDTO.getAccount();
//        String cachedCode = cacheService.get(cacheKey);
//        if (cachedCode == null || !cachedCode.equals(loginDTO.getVerifyCode())) {
//            throw new BusinessException(ResultCode.BAD_REQUEST.getCode(), "验证码错误或已过期");
//        }
//
//        // 获取用户信息
//        User user = userMapper.selectByMobile(loginDTO.getAccount());
//        if (user == null) {
//            throw new BusinessException(ResultCode.USER_NOT_EXIST);
//        }
//
//        // 更新登录信息
//        user.setLastLoginTime(LocalDateTime.now());
//        user.setLastLoginIp(loginDTO.getLoginIp());
//        userMapper.update(user);
//
//        // 生成token
//        String token = jwtTokenProvider.generateToken(user.getUsername());
//
//        // 清除验证码
//        cacheService.delete(cacheKey);
//
//        // 构建登录返回结果
//        return buildLoginVO(user, token);
//    }
//
//    /**
//     * 构建登录返回结果
//     */
//    private UserLoginVO buildLoginVO(User user, String token) {
//        UserLoginVO loginVO = new UserLoginVO();
//        loginVO.setUserId(user.getUserId());
//        loginVO.setUsername(user.getUsername());
//        loginVO.setNickname(user.getNickname());
//        loginVO.setAvatar(user.getAvatar());
//        loginVO.setMobile(user.getMobile());
//        loginVO.setEmail(user.getEmail());
//        loginVO.setUserLevel(user.getUserLevel());
//        // TODO: 获取用户等级名称
//        loginVO.setLoginTime(LocalDateTime.now().format(FORMATTER));
//        loginVO.setLoginIp(user.getLastLoginIp());
//        loginVO.setToken(token);
//        loginVO.setTokenExpireTime(LocalDateTime.now().plusDays(7).format(FORMATTER)); // 假设token有效期7天
//        return loginVO;
//    }
//
//    /**
//     * 根据账号获取用户信息
//     */
//    private User getUserByAccount(String account) {
//        // 尝试按用户名查询
//        User user = userMapper.selectByUsername(account);
//        if (user != null) {
//            return user;
//        }
//
//        // 尝试按手机号查询
//        user = userMapper.selectByMobile(account);
//        if (user != null) {
//            return user;
//        }
//
//        // 尝试按邮箱查询
//        return userMapper.selectByEmail(account);
//    }
//
//    /**
//     * 通过ID查询用户
//     *
//     * @param userId 用户ID
//     * @return 用户信息
//     */
//    @Override
//    public User getUserById(Long userId) {
//        return userMapper.selectById(userId);
//    }
//
//    /**
//     * 通过用户名查询用户
//     *
//     * @param username 用户名
//     * @return 用户信息
//     */
//    @Override
//    public User getUserByUsername(String username) {
//        return userMapper.selectByUsername(username);
//    }
//
//    /**
//     * 通过手机号查询用户
//     *
//     * @param mobile 手机号
//     * @return 用户信息
//     */
//    @Override
//    public User getUserByMobile(String mobile) {
//        return userMapper.selectByMobile(mobile);
//    }
//
//    /**
//     * 通过邮箱查询用户
//     *
//     * @param email 邮箱
//     * @return 用户信息
//     */
//    @Override
//    public User getUserByEmail(String email) {
//        return userMapper.selectByEmail(email);
//    }
//
//    /**
//     * 更新用户信息
//     *
//     * @param user 用户信息
//     * @return 是否成功
//     */
//    @Override
//    public boolean updateUser(User user) {
//        user.setUpdateTime(LocalDateTime.now());
//        return userMapper.update(user) > 0;
//    }
//
//    /**
//     * 删除用户
//     *
//     * @param userId 用户ID
//     * @return 是否成功
//     */
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public boolean deleteUser(Long userId) {
//        // 删除用户凭证
//        userCredentialMapper.deleteByUserId(userId);
//        // 删除用户
//        return userMapper.deleteById(userId) > 0;
//    }
//
//    @Override
//    public String logout(HttpServletRequest request) {
//        // 1. 获取当前认证信息
//        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
//        if (authentication == null || !authentication.isAuthenticated()) {
//            throw new SecurityException("用户未登录或认证已过期");
//        }
//        // 2. 获取用户信息
//        UserAuth userAuth = (UserAuth) authentication.getPrincipal();
//        Long userId = userAuth.getUserId();
//        String username = userAuth.getUsername();
//
//        // 3. 获取并销毁Token
//        String token = getJwtFromRequest(request);
//        String deviceId = DeviceUtil.generateDeviceId(request);
//        if (token != null) {
//            // 使Token失效（包括加入黑名单和删除Redis中的Token）
//            jwtTokenProvider.invalidateToken(token);
//            log.info("用户主动退出登录，用户ID: {}, 用户名: {}, 设备ID: {}", userId, username, deviceId);
//        }
//        return username;
//    }
//
//    /**
//     * 刷新token
//     *
//     * @param request
//     * @return
//     */
//    @Override
//    public String refreshToken(HttpServletRequest request) {
//        String token = getJwtFromRequest(request);
//        if (StringUtils.hasText(token)) {
//            return jwtTokenProvider.refreshToken(token);
//        }
//        throw new RuntimeException("Token不能为空");
//    }
//
//    /**
//     * 从请求头获取JWT Token
//     */
//    private String getJwtFromRequest(HttpServletRequest request) {
//        String bearerToken = request.getHeader("Authorization");
//        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
//            return bearerToken.substring(7);
//        }
//        return null;
//    }
//}
//
